treeview: Ensure the treeview has the implicit grab before grabbing focus
authorCarlos Garnacho <carlosg@gnome.org>
Mon, 13 Jun 2016 21:44:31 +0000 (23:44 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 20 Jun 2016 00:54:18 +0000 (20:54 -0400)
The cellrenderer signals might be taking the grab somewhere else, at which
point it's dubious we should attempt to take the keyboard focus into the
treeview.

This concretely breaks popovers triggered from cellrenderer signals on
button press, because the treeview will attempt to grab focus
inconditionally then.

https://bugzilla.gnome.org/show_bug.cgi?id=767468

gtk/gtktreeview.c

index e51aae45aea3d38f92c94c3a790e211620e695bb..935ee6685bdf7ea332bfc202afd7ef2cb171dd1b 100644 (file)
@@ -3050,9 +3050,13 @@ static void
 grab_focus_and_unset_draw_keyfocus (GtkTreeView *tree_view)
 {
   GtkWidget *widget = GTK_WIDGET (tree_view);
+  GtkWidget *grab_widget = gtk_grab_get_current ();
 
-  if (gtk_widget_get_can_focus (widget) && !gtk_widget_has_focus (widget))
+  if (gtk_widget_get_can_focus (widget) &&
+      !gtk_widget_has_focus (widget) &&
+      (!grab_widget || grab_widget == widget))
     gtk_widget_grab_focus (widget);
+
   tree_view->priv->draw_keyfocus = 0;
 }